package com.ruoyi.common.endpoint;

import cn.hutool.core.map.MapUtil;
import cn.hutool.json.JSONUtil;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.message.WebSocketMessage;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.HashMap;

/**
 * websocket 通信
 *
 * @author liliangyu
 */
@Component
@ServerEndpoint("/ws/{token}")
@Slf4j
public class WebSocketEndpoint {
    /**
     * 通信token 用于区分用户
     */
    private String token;

    private static HashMap<String, Session> SESSION_MAP = new HashMap<>();


    /**
     * 连接建立成功调用的方法
     *
     * @param session
     * @param token
     */
    @OnOpen
    public void onOpen(Session session, @PathParam("token") String token) {
        log.info("onOpen");
        SESSION_MAP.put(token, session);
        this.token = token;
    }

    /**
     * 连接关闭调用的方法
     *
     * @param session
     */
    @OnClose
    public void onClose(Session session) {
        log.info("onClose");
        MapUtil.removeAny(SESSION_MAP, token);
    }

    /**
     * 收到客户端消息后调用的方法
     *
     * @param message
     * @param session
     */
    @OnMessage
    public void onMessage(String message, Session session) {
//        log.info("onMessage");
    }

    /**
     * 发生错误时调用
     */
    @OnError
    public void onError(Session session, Throwable error) {
        log.info("onError");
    }

    /**
     * 发送消息
     */
    public void sendMsg(WebSocketMessage webSocketMessage) {
        String message = JSONUtil.toJsonStr(webSocketMessage);
        SESSION_MAP.keySet().forEach(token -> {
            Session session = SESSION_MAP.get(token);
            if (session.isOpen()) {
                try {
                    session.getBasicRemote().sendText(message);
                    log.info("发送消息成功:{}", message);
                } catch (IOException e) {
                    log.error("发送消息失败", e);
                    throw new ServiceException(e.getMessage());
                }
                log.debug("发送消息成功:{}", message);
            }
        });


    }


}
